//
//  HHMainViewController.swift
//  HHWeibo
//
//  Created by hehuafeng on 2017/2/14.
//  Copyright © 2017年 雷厉峰行. All rights reserved.
//

import UIKit

class HHMainViewController: UITabBarController {
    
    /// 定时器
    private var timer: Timer?

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. 初始化子控制器
        setupControllers()
        
        // 2. 初始化中间按钮
        setupComposeButton()
        
        // 3. 初始化定时器
        setupTimer()
        
        // 4. 设置tabbarController的代理
        delegate = self
        
        // 5. 监听用户登录通知
        NotificationCenter.default.addObserver(self, selector: #selector(showOAuthController), name: NSNotification.Name(rawValue: WeiBoUserLoginShouldNotification), object: nil)
    }
    
    deinit {
        // 1. 注销通知
        NotificationCenter.default.removeObserver(self)
        
        // 2. 销毁时钟
        timer?.invalidate()
    }
    
    /// 显示用户登录界面
    func showOAuthController() {
        // 1. 加载用户登录界面
        let OAuthController = HHOAuthViewController()
        let nav = UINavigationController(rootViewController: OAuthController)
        
        // 2. 显示登录控制器
        present(nav, animated: true, completion: nil)
    }
    
    
    /// 初始化定时器
    private func setupTimer() {
        timer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
    }
    
    /// 设置未读消息数
    @objc private func updateTimer() {
        HHNetworkManager.shared.unreadCount { (count) in
            // 1. 设置tabbar
            self.tabBar.items![0].badgeValue = "\(count)"
            
            // 2. 设置应用程序提醒数字
            UIApplication.shared.applicationIconBadgeNumber = count
        }
    }
    
    /// 设置控制器支持设备方向
    //  通过push方式压入的控制器存在父子关系, 
    //  当父控制器不支持某个设备方向时, 其子控制器也不支持某个设备方向
    //  portrait : 竖屏
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
        return .portrait
    }
    
    // MARK: 私有属性
    lazy var composeButton: UIButton = UIButton.cz_imageButton("tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")
    
    // MARK: 监听方法
    // FIXME: 没有实现
    // @objc : 允许函数在‘运行时’ 通过 OC 的消息机制调用
    func composeStatus() {
        print("撰写微博")
    }
}

// MARK: - UITabBarControllerDelegate
extension HHMainViewController: UITabBarControllerDelegate {
    
    /// 是否可以显示选中tabbarItem对应的控制器
    ///
    /// - Parameters:
    ///   - tabBarController: tabBarController
    ///   - viewController: viewController 目标控制器
    /// - Returns: 是否可以跳转
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        // 1. 获取viewController的索引
        let index = (childViewControllers as NSArray).index(of: viewController)
        
        // 2. 如果当前显示的控制器为首页控制器, 则再次点击滚动tableView至顶部
        if selectedIndex == 0 && index == 0 {
            // 2.1 获取tableView
            let nav = childViewControllers[0] as! HHNavigationController
            let home = nav.childViewControllers[0] as! HHHomeViewController
            
            // 2.2 滚动tableView
            home.tableView?.setContentOffset(CGPoint(x: 0, y: -64), animated: true)
            
            // 2.3 加载更多数据
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: { 
                home.loadData()
            })
        }
        
        // 3. 如果不是中间按钮对应的控制器, 则执行跳转
        return !viewController.isMember(of: UIViewController.self)
    }
}

// MARK: - 设置界面
extension HHMainViewController {
    
    func setupComposeButton() {
        // 1. 添加到tabbar
        tabBar.addSubview(composeButton)
        
        // 2. 计算按钮宽度
        let count = CGFloat(childViewControllers.count)
        
        // 3. 设置按钮内边距, 盖住容错点
        let w = tabBar.bounds.width / count - 1
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0)
        
        // 4. 设置按钮监听方法
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
    }
    
    /// 初始化子控制器
    func setupControllers() {
        // 0. 判断沙盒中是否存在json
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (path as NSString).appendingPathComponent("main.json")
        
        var data = NSData(contentsOfFile: jsonPath)
        if data == nil {  // 如果沙盒中不存在则加载网络数据
            data = NSData(contentsOfFile: Bundle.main.path(forResource: "main.json", ofType: nil)!)
            
        }
        
        
        // 1. 创建子控制器信息字典数组, 记得一定要传递数据
        // 加载json
        guard let array = try! JSONSerialization.jsonObject(with: data as! Data, options: []) as? [[String : Any]]  else {
            return
        }
        
        // 2. 创建子控制器数组
        var arrM = [UIViewController]()
        
        // 3. 添加子控制器
        for dict in array {
            arrM.append(controller(dict: dict ))
        }
        
        // 4. 设置为子控制器
        viewControllers = arrM
    }
    
    /// 创建子控制器
    ///
    /// - Parameter dict: 信息字典
    /// - Returns: 子控制器
    private func controller (dict: [String : Any]) -> UIViewController {
        // 1. 获取控制器信息
        // 2. 使用反射机制创建控制器
        guard let className = dict["className"] as? String,
        let title = dict["title"] as? String,
        let imageName = dict["imageName"] as? String,
        let dictInfo = dict["visitorInfo"] as? [String : String],
        let cls = NSClassFromString(Bundle.main.namespace + "." + className) as? HHBaseViewController.Type else {
            return UIViewController()
        }
        
        // 3. 创建控制器
        let vc = cls.init()
        
        // 4. 设置控制器相关属性
        vc.title = title
        vc.visitorInfoDictionary = dictInfo
        
        // 5. 设置图片和文字属性
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
        let image = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)  // 保证图片不被渲染
        vc.tabBarItem.selectedImage = image
        
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.orange], for: .highlighted)
        
        // 6. 创建导航控制器
        let nav = HHNavigationController(rootViewController: vc)
        
        // 7. 返回导航控制器
        return nav
    }
}
